﻿/*
 * 这是您可以在任何 ASP.NET Core MVC 应用程序中找到的控制器；Orchard 是一个 MVC 应用程序，
 * 尽管它远不止于此。
 *
 * Orchard 模块基本上是一个 MVC 区域。您可以创建不与 Orchard 交互的区域，
 * 您只需使用标准的 ASP.NET Core MVC 技能。当然，我们想要更多，所以让我们仔细看看。
 *
 * 在这里您将看到如何使用一些简单的 ASP.NET Core 和 Orchard Core 服务。
 */

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using OrchardCore.DisplayManagement.Notify;
using System.Threading.Tasks;

namespace Ruitu.Edu.TrainingDemo.Controllers;

public class YourFirstOrchardCoreController : Controller
{
    private readonly INotifier _notifier;
    private readonly IStringLocalizer T;
    private readonly IHtmlLocalizer H;

    // 您可以在注入后使用 ILogger 的非泛型对应项，但要确保注入泛型版本，否则日志条目不会包含类名。
    private readonly ILogger _logger;

    // Orchard Core 使用 ASP.NET Core 内置的依赖注入功能。您可以使用模块的 Startup 类向服务提供程序注册自己的服务。
    // 要了解更多信息，请参阅：https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection
    public YourFirstOrchardCoreController(
        INotifier notifier,
        IStringLocalizer<YourFirstOrchardCoreController> stringLocalizer,
        IHtmlLocalizer<YourFirstOrchardCoreController> htmlLocalizer,
        ILogger<YourFirstOrchardCoreController> logger)
    {
        _notifier = notifier;
        _logger = logger;

        T = stringLocalizer;
        H = htmlLocalizer;
    }

    // 这是一个将返回一些消息的简单操作。这里没有什么特别的，只是演示这在启用模块后将在 Orchard Core 中正常工作。
    // 此操作的路由将是 /Ruitu.Edu.TrainingDemo/YourFirstOrchardCore/Index。
    public ActionResult Index()
    {
        // 可以使用 IStringLocalizer 服务本地化简单文本，如下所示。要了解有关 Orchard 中本地化如何工作的更多信息，
        // 请查看文档：https://docs.orchardcore.net/en/latest/docs/reference/modules/Localize/
        ViewData["Title"] = T["This is your first OrchardCore Controller!"];
        ViewData["Message"] = T["Hello you!"];

        // 视图中没有发生什么特别的事情，但您可以在 Views/YourFirstOrchardController/Index.cshtml 文件中查看它。
        return View();
    }

    // 让我们在这里看看一些自定义路由。此属性将覆盖默认路由并使用这个路由。
    [Route("TrainingDemo/NotifyMe")]
    public async Task<IActionResult> NotifyMe()
    {
        // ILogger 是一个 ASP.NET Core 服务，它将向特定的日志文件写入内容。在 Orchard Core 中，NLog 用于日志记录，
        // 默认错误级别是"Error"。您可以在 /App_Data/logs/orchard-log-[date].log 文件中找到错误日志。
        // 日志记录可以在 Web 项目（例如 OrchardCore.Cms.Web）的 NLog.config 文件中配置。
        // 哦，还有一件事：如果您安装 Lombiq Orchard Visual Studio 扩展，它会为您提供一个方便的错误日志观察器，
        // 如果有新错误，它会亮起！在这里查看：
        // https://marketplace.visualstudio.com/items?itemName=LombiqVisualStudioExtension.LombiqOrchardVisualStudioExtension
        _logger.LogError("You have been notified about some error!");

        // INotifier 是一个 Orchard Core 服务，用于向用户发送消息。此服务几乎可以在代码库中的任何地方使用，
        // 不仅在控制器中。此服务需要 LocalizedHtmlString 对象，因此需要使用 IHtmlLocalizer 服务进行本地化。
        await _notifier.InformationAsync(H["Congratulations! You have been notified! Check the error log too!"]);
        await _notifier.ErrorAsync(H["This is Error Infomation!"]);

        return View();

        // NEXT STATION: Views/YourFirstOrchardCore/NotifyMe.cshtml
    }
}
